Java Swing ํ๋ก์ ํธ ์์ํ๊ธฐ: ์ฒซ ๋ฒ์งธ ์๋์ฐ ๋์ฐ๊ธฐ
์๋ฐ ์ค์(Java Swing)์ JDK์ ๊ธฐ๋ณธ ํฌํจ๋์ด ์์ด ๋ณ๋์ ๋ณต์กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ์์ด ๋ฐ๋ก ์์ํ ์ ์๋ค๋ ๊ฒ์ด ํฐ ์ฅ์ ์ ๋๋ค. 2026๋ ๊ธฐ์ค ์ต์ JDK ํ๊ฒฝ์์๋ ๋์ผํ๊ฒ ์๋ํ๋ ๊ธฐ๋ณธ์ ์ธ ์ค์ ํ๋ก์ ํธ ์ค์ ๊ณผ ์ฒซ ์คํ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
1. ๊ฐ๋ฐ ํ๊ฒฝ ์ค๋น
- JDK: ์ต์ LTS ๋ฒ์ (Java 17, 21, 25 ๋ฑ)์ด ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.
- IDE: IntelliJ IDEA, Eclipse, ํน์ VS Code ๋ฑ ์ด๋ค ๋๊ตฌ๋ ์๊ด์์ต๋๋ค.
- ๋น๋ ๋๊ตฌ (์ ํ ์ฌํญ): Maven์ด๋ Gradle์ ์ฌ์ฉํ๋ฉด ํ๋ก์ ํธ ๊ด๋ฆฌ๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค.
2. ํ๋ก์ ํธ ์์ฑ ๋ฐ ์ค์
๋ฐฉ๋ฒ A: Maven ์ฌ์ฉ ์
pom.xml์ ์๋ฐ ๋ฒ์ ์ ์ค์ ํฉ๋๋ค. (Swing์ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฏ๋ก ๋ณ๋์ dependency๊ฐ ํ์ ์์ต๋๋ค.)
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>๋ฐฉ๋ฒ B: Gradle ์ฌ์ฉ ์ (๊ถ์ฅ)
build.gradle ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํฉ๋๋ค.
plugins {
id 'java'
}
group = 'com.example'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}3. ์ฒซ ๋ฒ์งธ Swing ์ฝ๋ ์์ฑ
Main.java ํ์ผ์ ์์ฑํ๊ณ ์๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ค์ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ **EDT(Event Dispatch Thread)**๋ฅผ ํตํด UI๋ฅผ ์คํํ๋ ๊ฒ์
๋๋ค.
HelloSwing.java
import javax.swing.*;
public class HelloSwing {
public static void main(String[] args) {
// UI ์์
์ EDT(Event Dispatch Thread)์์ ์คํํ๋๋ก ์์ฒญ
SwingUtilities.invokeLater(() -> {
createAndShowGUI();
});
}
private static void createAndShowGUI() {
// 1. ์๋์ฐ ํ๋ ์ ์์ฑ
JFrame frame = new JFrame("My First Swing App");
// 2. ๋ซ๊ธฐ ๋ฒํผ์ ๋๋ ์ ๋ ํ๋ก๊ทธ๋จ๋ ์ข
๋ฃ๋๋๋ก ์ค์
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 3. ์๋์ฐ ํฌ๊ธฐ ์ค์ (๊ฐ๋ก, ์ธ๋ก)
frame.setSize(400, 300);
// 4. ์ปดํฌ๋ํธ ์ถ๊ฐ (๋ผ๋ฒจ ํ๋ ์ถ๊ฐ)
JLabel label = new JLabel("Hello, Java Swing!", SwingConstants.CENTER);
frame.add(label);
// 5. ์๋์ฐ๋ฅผ ํ๋ฉด ์ค์์ ๋ฐฐ์น
frame.setLocationRelativeTo(null);
// 6. ์๋์ฐ๋ฅผ ํ๋ฉด์ ํ์
frame.setVisible(true);
}
}4. ์ฝ๋ ์ค๋ช : ์ฃผ์ ์ปดํฌ๋ํธ ๋ถ์
JFrame
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์ธ ์๋์ฐ๋ฅผ ๋ํ๋ด๋ ํด๋์ค์ ๋๋ค. ์ ๋ชฉ ํ์์ค, ์ต์ํ/์ต๋ํ ๋ฒํผ, ๋ซ๊ธฐ ๋ฒํผ ๋ฑ์ ํฌํจํฉ๋๋ค.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE): ์ด ์ค์ ์ด ์์ผ๋ฉด ์๋์ฐ๋ฅผ ๋ซ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ฐ ํ๋ก์ธ์ค๊ฐ ๊ณ์ ์คํ๋๋ฏ๋ก ๋ฐ๋์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
SwingUtilities.invokeLater(...)
- ์ค์์ ๋ชจ๋ UI ์์ ์ ์ ์ฉ ์ค๋ ๋(EDT)์์ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค. ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ์ธ ์ค๋ ๋์์ ์์ฑ๋ ์์ ์ ์์ ํ๊ฒ EDT๋ก ๋๊ฒจ ์คํํ ์ ์์ต๋๋ค.
JLabel
- ํ๋ฉด์ ํ ์คํธ๋ ์ด๋ฏธ์ง๋ฅผ ํ์ํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ปดํฌ๋ํธ์ ๋๋ค.
5. ์คํ ๋ฐ ํ์ธ
์ฝ๋๋ฅผ ์คํํ๋ฉด ์ค์์ "Hello, Java Swing!"์ด๋ผ๋ ๊ธ์๊ฐ ์ ํ 400x300 ํฌ๊ธฐ์ ์๋์ฐ๊ฐ ํ์ ๋ฉ๋๋ค.
์ด์ ์ฌ๊ธฐ์ ๋ฒํผ(JButton), ์
๋ ฅ์ฐฝ(JTextField), ์ฒดํฌ๋ฐ์ค(JCheckBox) ๋ฑ์ ์ถ๊ฐํ๋ฉฐ ๊ธฐ๋ฅ์ ํ์ฅํด ๋ณด์ธ์. ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ frame.add()๋ฅผ ํตํด ํ๋ฉด์ ๋ถ์ผ ์ ์์ผ๋ฉฐ, ๋ ์ด์์ ๋งค๋์ (LayoutManager)๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ ๊ตํ๊ฒ ๋ฐฐ์นํ ์ ์์ต๋๋ค.
๋ค์ ๋จ๊ณ ์ ์
- ์ด๋ฒคํธ ์ฒ๋ฆฌ: ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์๋ฆผ์ฐฝ(
JOptionPane) ๋์ฐ๊ธฐ. - ๋ ์ด์์:
BorderLayout์ด๋FlowLayout์ดํดํ๊ธฐ. - ๋ฐ์ดํฐ ์ฐ๋: ์ ๋ ฅ์ฐฝ์ ์ด ๊ธ์๋ฅผ ๋ผ๋ฒจ๋ก ์ฎ๊ธฐ๊ธฐ.
์ด์ ๋น์ ์ ์ฒซ ๋ฒ์งธ ์๋ฐ ๋ฐ์คํฌํฑ ์ฑ์ด ์์ฑ๋์์ต๋๋ค!